﻿// 0725train.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <algorithm>
#include <sstream>

using namespace std;
/*
给出由小写字母组成的字符串 S，重复项删除操作会选择两个相邻且相同的字母，并删除它们。
在 S 上反复执行重复项删除操作，直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例：
输入："abbaca"
输出："ca"
解释：
例如，在 "abbaca" 中，我们可以删除 "bb" 由于两字母相邻且相同，这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca"，其中又只有 "aa" 可以执行重复项删除操作，所以最后的字符串为 "ca"。
提示：
1. 1 <= S.length <= 20000
2. S 仅由小写英文字母组成
*/
void solve1(string oh_str)
{
    stack<char> oh_stack;
    string result_str;
    for (auto& s_char : oh_str)
    {
        bool is_pop = false;
        if (!oh_stack.empty() && s_char == oh_stack.top())
        {
            //如果char跟栈顶相同，pop，char不入栈
            oh_stack.pop();
            is_pop = true;
        }
        
        if (!is_pop)
        {
            //pop的字符不入栈
            oh_stack.push(s_char);
        }
    }

    
    while (!oh_stack.empty())
    {
        result_str += oh_stack.top();
        oh_stack.pop();
    }
    //翻转字符reverse
    reverse(result_str.begin(), result_str.end());

    cout << result_str;
}



/*
某学校举行运动，学生们按编号(1、2、3.....n) 进行标识,
现需要按照身高由低到高排列，对身高相同的人，按体重由轻到重排列，
对于身高体重都相同的人，维持原有的编号顺序关系。
请输出排列后的学生编号

输入描述
两个序列，
每个序列由 n 个正整数组成(0 < n < 100)。
第一个序列中的数值代表身高，
第二个序列中的数值代表体重。

输出描述
排列结果，每个数值都是原始序列中的学生编号，编号从 1 开始

输入
4
100 100 120 130
40 30 60 50
输出
2134

*/
struct People {
    int id, height, weight;

    People(int id, int height, int weight) :id(id + 1), height(height), weight(weight) {};
};

bool Compare(const People& a, const People& b) {
    if (a.height != b.height)
    {
        return a.height < b.height;
    }
    else if (a.weight != b.weight) {
        return a.weight < b.weight;
    }
    else {
        return a.id < b.id;
    }
}

void solve2(int total_c, vector<int>height_vec, vector<int>weight_vec)
{
    vector<People>result;
    for (int i = 0; i < height_vec.size(); i++)
    {
        int height = height_vec[i];
        int weight = weight_vec[i];

        People people = {i, height, weight};
        result.push_back(people);
    }

    sort(result.begin(), result.end(), Compare);
    for (auto& item : result)
    {
        cout << item.id;
    }

    //------
}

int main()
{
    {
        /*
        4
        100 100 120 130
        40 30 60 50

        2134
        */
        string count_str;
        vector<int>height_vec;
        vector<int>weight_vec;
        getline(cin, count_str);
        int count = stoi(count_str);

        string h_str;
        getline(cin, h_str);
        stringstream sstream(h_str);
        string h_str_tmp;
        while (sstream >> h_str_tmp)
        {
            height_vec.push_back(stoi(h_str_tmp));
        }

        string w_str;
        getline(cin, w_str);
        stringstream sstream1(w_str);
        string w_str_tmp;
        while (sstream1 >> w_str_tmp)
        {
            weight_vec.push_back(stoi(w_str_tmp));
        }

        /*for (auto& item : height_vec)
        {
            cout << item << endl;
        }

        for (auto& item : weight_vec)
        {
            cout << item << endl;
        }

        /*int count = 4;
        vector<int>height_vec = { 100,100,120,130 };
        vector<int>weight_vec = { 40,30,60,50 };*/
        solve2(count, height_vec, weight_vec);
    }

    string input;
    getline(cin, input);
    solve1(input);
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
